﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using Aga.Psad.Backend.Entities;
using Aga.Psad.Backend.Repositories;
using Aga.Psad.Mvc.Services.Dtos;
using AutoMapper;

namespace Aga.Psad.Mvc.Services
{
    public class DocumentoDataService : IDocumentoDataService
    {
        #region IDocumentoDataService Members

        public bool CheckService()
        {
            return true;
        }

        public DocumentoDto InformatizarDocumento(int clienteId, int tipoDocumentoId, string numeroDesde, int caja, int numeroImagenes)
        {
            Mapper.CreateMap<Documento, DocumentoDto>();
            DocumentoRepository documentoRepository = new DocumentoRepository();
            ImagenRepository imagenRepository = new ImagenRepository();

            // obtengo el documento actual
            Documento documentoActual = documentoRepository.GetByClienteNumeroAndCaja(clienteId, tipoDocumentoId, numeroDesde, caja);

            // si no existe lo creo
            if (documentoActual == null)
            {
                // creo el documento
                documentoActual = new Documento()
                {
                    ClienteId = clienteId, 
                    TipoDocumentoId = tipoDocumentoId, 
                    NumeroDesde = numeroDesde, 
                    Caja = caja
                };

                // obtengo el id
                documentoRepository.Save(documentoActual);
            }

            // Por cada registro tengo que chequear si la ultima imagen
            // representa que se agrego información con respecto
            // a la información existente en el servidor.
            // Chequeo CantImagesServer < AGA_UltImagen
            //    - CantImagesServer (Count(Imagenes) Where Documento = DocumentoId)
            // si no se agrego, no hago nada
            // si se agrego tengo que generar los registros de imagen formando
            // el nombre como: {AGA_Grupo}_{n}.jpg donde CantImagesServer < n <= AGA_UltImagen

            int cantidadImagenes = imagenRepository.GetCountByDocumento(documentoActual.Id);

            if (cantidadImagenes < numeroImagenes)
            {
                // para que la nomenclatura de las imagenes no sea en base 0
                // sumo uno al numero inicial y voy hasta el <= de la ultima imagen
                cantidadImagenes++;
                for (int i = cantidadImagenes; i <= numeroImagenes; i++)
                {
                    imagenRepository.Save(new Imagen() {
                            DocumentoId = documentoActual.Id,
                            Nombre = string.Format("{0}_{1}.jpg", numeroDesde, i)
                        });
                }
            }

            // preparo el dto para retornar
            DocumentoDto dto = Mapper.Map<Documento, DocumentoDto>(documentoActual);

            return dto;
        }

        public int NuevoDocumento(DocumentoDto documento)
        {
            Mapper.CreateMap<DocumentoDto, Documento>().ForMember(c => c.Id, a => a.Ignore());

            Documento entity = Mapper.Map<DocumentoDto, Documento>(documento);

            DocumentoRepository repository = new DocumentoRepository();
            repository.Save(entity);

            return entity.Id;
        }

        public void ActualizarDocumento(DocumentoDto documento)
        {
            DocumentoRepository documentoRepository = new DocumentoRepository();

            Documento entity = documentoRepository.GetById(documento.Id);

            Mapper.CreateMap<DocumentoDto, Documento>().ForMember(c => c.Id, a => a.Ignore());

            entity = Mapper.Map<DocumentoDto, Documento>(documento, entity);

            documentoRepository.Save(entity);
        }

        public DocumentoDto ObtenerDocumento(int clienteId, int tipoDocumentoId, string numeroDesde, int caja)
        {
            DocumentoRepository repository = new DocumentoRepository();
            Documento documento = repository.GetByClienteNumeroAndCaja(clienteId, tipoDocumentoId, numeroDesde, caja);

            Mapper.CreateMap<Documento, DocumentoDto>();

            var dto = Mapper.Map<Documento, DocumentoDto>(documento);

            return dto;
        }

        public DocumentoDto ObtenerDocumentoByNumeroDesde(int clienteId, int tipoDocumentoId, string numeroDesde)
        {
            DocumentoRepository repository = new DocumentoRepository();
            Documento documento = repository.GetByClienteNumero(clienteId, tipoDocumentoId, numeroDesde);

            Mapper.CreateMap<Documento, DocumentoDto>();

            var dto = Mapper.Map<Documento, DocumentoDto>(documento);

            return dto;
        }

        public DocumentoDto ObtenerDocumentoById(int documentoId)
        {
            DocumentoRepository repository = new DocumentoRepository();
            Documento documento = repository.GetById(documentoId);

            Mapper.CreateMap<Documento, DocumentoDto>();

            var dto = Mapper.Map<Documento, DocumentoDto>(documento);

            return dto;
        }

        public int ObtenerCantidadImagenesDocumento(int documentoId)
        {
            ImagenRepository repository = new ImagenRepository();
            int cantidad = repository.GetAll().Where(imagen => imagen.DocumentoId.Equals(documentoId)).Count();

            return cantidad;
        }

        public int NuevaImagen(ImagenDto imagen)
        {
            Mapper.CreateMap<ImagenDto, Imagen>().ForMember(c => c.Id, a => a.Ignore());

            Imagen entity = Mapper.Map<ImagenDto, Imagen>(imagen);

            ImagenRepository repository = new ImagenRepository();
            repository.Save(entity);

            return entity.Id;
        }


        public TipoDocumentoDto[] ObtenerTiposDeDocumento()
        {
            TipoDocumentoRepository repository = new TipoDocumentoRepository();
            var tipos = repository.GetAll();

            Mapper.CreateMap<TipoDocumento, TipoDocumentoDto>();

            var dtos = Mapper.Map<List<TipoDocumento>, TipoDocumentoDto[]>(tipos);

            return dtos;
        }

        public ClienteDto[] ObtenerClientes()
        {
            ClienteRepository repository = new ClienteRepository();
            var clientes = repository.GetAll();

            Mapper.CreateMap<Cliente, ClienteDto>();

            var dtos = Mapper.Map<List<Cliente>, ClienteDto[]>(clientes);

            return dtos;
        }

        public ClienteDto[] ObtenerClientesPorTipo(int tipo)
        {
            ClienteRepository repository = new ClienteRepository();

            var clientes = repository.GetAll()
                .Where(c => c.Tipo == tipo)
                .ToList();

            Mapper.CreateMap<Cliente, ClienteDto>();

            var dtos = Mapper.Map<List<Cliente>, ClienteDto[]>(clientes);

            return dtos;
        }

        #endregion
    }
}
